package com.wangfugui.apprentice.common.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MinIoUtil {

    /**
     * 生成文件名
     *
     * @param basePath         子文件夹
     * @param originalFilename 原始文件名
     * @return 文件名
     */
    public static String joinObjectName(String basePath, String originalFilename) {
        // 定义子文件的格式
        String dir = basePath + "/" + DateUtils.format(DateUtils.now(), "yyyy-MM-dd");
        String filename = FileUtil.mainName(originalFilename) + "_" + System.currentTimeMillis();
        String fileExt = FileUtil.extName(originalFilename);
        String objectName = String.format("%s/%s.%s", dir, filename, fileExt);
        return objectName;
    }

    /**
     * 去掉url中的参数
     *
     * @param url url
     * @return 去掉参数的url
     */
    public static String removeParams(String url) {
        int index = url.indexOf("?");
        return index == -1 ? url : url.substring(0, index);
    }

    /**
     * 将stream转换成netty buf
     *
     * @param is stream
     * @return netty buf
     */
    public static ByteBuf streamToByteBuf(InputStream is) {
        return Unpooled.copiedBuffer(IoUtil.read(is).toByteArray());
    }

    /**
     * 将输入流（InputStream）转换为字节数组（byte[]）。
     * <p>
     * 该函数通过读取输入流中的数据，并将其写入到字节数组输出流（ByteArrayOutputStream）中，
     * 最终将输出流的内容转换为字节数组返回。
     *
     * @param inputStream 要转换的输入流，不能为null。
     * @return 包含输入流数据的字节数组。
     * @throws IOException 如果读取输入流时发生I/O错误。
     */
    public static byte[] toByteArray(InputStream inputStream) throws IOException {
        // 创建一个字节数组输出流，用于缓存从输入流读取的数据
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[1024];

        // 从输入流中读取数据，直到读取到流的末尾（返回-1）
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead); // 将读取到的数据写入到字节数组输出流中
        }
        // 确保所有数据都已写入到输出流中
        buffer.flush();
        // 将字节数组输出流的内容转换为字节数组并返回
        return buffer.toByteArray();
    }

}
